import { defineStore } from 'pinia'
import { userApi } from '@/api'
import router from '@/router'

/**
 * 用户状态管理store
 */
export const useUserStore = defineStore('user', {
  state: () => ({
    // 用户令牌
    token: localStorage.getItem('token') || '',
    // 用户信息
    userInfo: JSON.parse(localStorage.getItem('userInfo') || '{}'),
    // 用户角色
    role: localStorage.getItem('role') || ''
  }),
  
  getters: {
    /**
     * 判断用户是否已登录
     * @returns {boolean} - 是否已登录
     */
    isLoggedIn: (state) => !!state.token,
    
    /**
     * 获取用户姓名
     * @returns {string} - 用户姓名
     */
    userName: (state) => state.userInfo.name || '',
    
    /**
     * 判断是否为学生角色
     * @returns {boolean} - 是否为学生
     */
    isStudent: (state) => state.role === 'student',
    
    /**
     * 判断是否为教师角色
     * @returns {boolean} - 是否为教师
     */
    isTeacher: (state) => state.role === 'teacher'
  },
  
  actions: {
    /**
     * 设置用户令牌
     * @param {string} token - 用户令牌
     */
    setToken(token) {
      this.token = token
      localStorage.setItem('token', token)
    },
    
    /**
     * 设置用户信息
     * @param {Object} userInfo - 用户信息
     */
    setUserInfo(userInfo) {
      this.userInfo = userInfo
      localStorage.setItem('userInfo', JSON.stringify(userInfo))
      
      // 同时设置角色
      if (userInfo && userInfo.role) {
        this.role = userInfo.role
        localStorage.setItem('role', userInfo.role)
      }
    },
    
    /**
     * 清除用户信息
     */
    clearUserInfo() {
      this.token = ''
      this.userInfo = {}
      this.role = ''
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      localStorage.removeItem('role')
    },
    
    /**
     * 用户登录
     * @param {Object} loginData - 登录信息
     * @returns {Promise<boolean>} - 登录是否成功
     */
    async login(loginData) {
      try {
        const res = await userApi.login(loginData)
        if (res.code === 200 && res.data) {
          this.setToken(res.data.token)
          this.setUserInfo(res.data.userInfo)
          return true
        }
        return false
      } catch (error) {
        console.error('登录失败:', error)
        return false
      }
    },
    
    /**
     * 获取用户信息
     * @returns {Promise<Object|null>} - 用户信息
     */
    async getUserInfo() {
      try {
        const res = await userApi.getUserInfo()
        if (res.code === 200 && res.data) {
          this.setUserInfo(res.data)
          return res.data
        }
        return null
      } catch (error) {
        console.error('获取用户信息失败:', error)
        return null
      }
    },
    
    /**
     * 用户登出
     * @returns {Promise<boolean>} - 登出是否成功
     */
    async logout() {
      try {
        if (this.token) {
          await userApi.logout()
        }
        this.clearUserInfo()
        router.push('/login')
        return true
      } catch (error) {
        console.error('登出失败:', error)
        this.clearUserInfo()
        router.push('/login')
        return false
      }
    }
  }
}) 